#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include "mutex/Mutex.hpp"//目录之下地头文件的包含

// 直接在全局创建mutex
Mutex lock;

struct data
{
    std::string name;
    pthread_mutex_t *lock; // 引用传参
};

int tickets = 100; // 共享资源
// 定义全局的互斥锁
//  pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;

void *routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        // 加锁
        //  pthread_mutex_lock(&gmutex);
        //  data* d = static_cast<data*>(args);
        std::string name = static_cast<const char *>(args);
        // pthread_mutex_lock(d->lock);
        // lock.Lock();
        LockGuard lockguard(&lock);
        {//手动添加一个作用域，更加精确地掌控临界区
            if (tickets > 0)
            {
                usleep(10000);
                printf("线程%s,抢到了票，剩余票数:%d\n", name.c_str(), tickets--);
                // 解锁
                //  pthread_mutex_unlock(d->lock);
                //  lock.Unlock();
            }
            else
            {
                // 解锁
                //  pthread_mutex_unlock(d->lock);
                //  lock.Unlock();
                break;
            }
        }
    }
    return (void *)0;
}

int main()
{
    // 创建使用在栈上动态开辟的锁需要调用pthread_mutex_init 初始化，调用pthread_mutex_destroy来销毁
    pthread_mutex_t lock;
    // pthread_mutex_init(&lock,nullptr);

    // 而想要让所有的线程拿到局部的锁，可以通过传参的方式；
    pthread_t t1, t2, t3, t4;
    // 创建线程
    pthread_create(&t1, nullptr, routine, (void *)"thread-1");
    pthread_create(&t2, nullptr, routine, (void *)"thread-2");
    pthread_create(&t3, nullptr, routine, (void *)"thread-3");
    pthread_create(&t4, nullptr, routine, (void *)"thread-4");

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    pthread_join(t4, nullptr);

    // 销毁锁
    //  pthread_mutex_destroy(&lock);

    return 0;
}

// int main()
// {
//     //创建使用在栈上动态开辟的锁需要调用pthread_mutex_init 初始化，调用pthread_mutex_destroy来销毁
//     pthread_mutex_t lock;
//     pthread_mutex_init(&lock,nullptr);

//     //而想要让所有的线程拿到局部的锁，可以通过传参的方式；
//     pthread_t t1,t2,t3,t4;
//     //创建线程
//     data d1{"thread-1",&lock};
//     pthread_create(&t1,nullptr,routine , (void*)&d1);

//     data d2{"thread-2",&lock};
//     pthread_create(&t2,nullptr,routine , (void*)&d2);

//     data d3{"thread-3",&lock};
//     pthread_create(&t3,nullptr,routine , (void*)&d3);

//     data d4{"thread-4",&lock};
//     pthread_create(&t4,nullptr,routine , (void*)&d4);

//     pthread_join(t1,nullptr);
//     pthread_join(t2,nullptr);
//     pthread_join(t3,nullptr);
//     pthread_join(t4,nullptr);

//     //销毁锁
//     pthread_mutex_destroy(&lock);

//     return 0;
// }
